#Python 程序在 nohup 中没有打印
nohup
用于避免终端挂断时程序退出,在运行耗时很长的任务时非常实用。
nohup command &
使用 nohup
运行程序时,它会将 标准输出 和 标准错误 重定向到 nohup.out
中。
可以使用 tail -f nohup.out
命令来实时查看程序输出的信息。
但是如果你使用 nohup
运行的是 Python 的脚本,你会发现 nohup.out
中很久都没有信息显示。
nohup script.py &
这是因为 Python 程序在交互模式下运行时 标准输出 和 标准错误 采用行缓冲,但在非交互模式下 标准输出 使用块缓冲。
- 块缓冲:存缓冲区满时进行实际 I/O 并清空缓冲区
- 行缓存:缓冲区满或遇到换行符时进行实际 I/O 并清空缓冲区
因此,需要等待缓冲区写满,进行实际 I/O 后,才能在 nohup.out
中看到来自 标准输出 的信息。
#解决办法
#关闭缓冲
Python 通过 -u
选项运行脚本时会关闭缓冲功能,但这样会降低性能。
nohup python -u script.py &
#手动设置行缓冲
可以使用 sys.stdout.reconfigure
方法手动将 标准输出 设为行缓冲。
import sys
sys.stdout.reconfigure(line_buffering=True)